package gc;
/*
配置一：
-XX:NewSize=104857600 -XX:MaxNewSize=104857600 -XX:InitialHeapSize=209715200 -XX:MaxHeapSize=209715200 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=20971520 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
观察 jstat 可以发现，一秒一次ygc ，两三秒一次 fgc
原因： 每次Young GC后，有30MB的对象存活了，此时因为Survivor区域放不下，所以直接进入老年代了。

解决，增大年轻代的内存空间，增加Survivor的内存
配置二：优化
-XX:NewSize=209715200 -XX:MaxNewSize=209715200 -XX:InitialHeapSize=314572800 -XX:MaxHeapSize=314572800 -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=20971520 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

堆大小调大为了300MB，年轻代给了200MB，
同时“-XX:SurvivorRatio=2”表明，Eden:Survivor:Survivor的比例为2:1:1，
所以Eden区是100MB，每个Survivor区是50MB，老年代也是100MB。

观察 jstat看到，每秒的Young gC过后，都会有20MB左右的存活对象进入Survivor，
但是每个Survivor区都是50MB的大小，因此可以轻松容纳，而且一般不会过50%的动态年龄判定的阈值。
我们可以清晰看到每秒触发Yuong GC过后，几乎就没有对象会进入老年代，最终就600KB的对象进入了老年代里，
其他就没有对象进入老年代了。

 */
/**
 * @author eii
 * @sice 2020/12/21
 */
public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(30000);
        while (true) {
            loadData();
        }
    }

    private static void loadData() throws InterruptedException {
        byte[] data = null;
        for (int i = 0; i < 4; i++) {
            data = new byte[10 * 1024 * 1024];
        }
        data = null;

        byte[] data1 = new byte[10 * 1024 * 1024];
        byte[] data2 = new byte[10 * 1024 * 1024];

        byte[] data3 = new byte[10 * 1024 * 1024];

        data3 = new byte[10 * 1024 * 1024];

        Thread.sleep(1000);
    }
}
